//
//  StatusListViewModel.swift
//  glzbowei
//
//  Created by 高伦展 on 2018/1/7.
//  Copyright © 2018年 glz. All rights reserved.
//

import Foundation
import SDWebImage

//微博数据列表模型 - 封装网络方法
class StatusListViewModel {
    
    lazy var statusList = [StatusViewModel]()
    
    var pulldownCount:Int?
    
    
    ///isPullup 是否上拉刷新
    func loadStatus(isPullup isPullup:Bool, finished: @escaping (_ isSuccessed: Bool)->()) {
        
        let since_id : Int = isPullup ? 0 : Int(statusList.first?.status.id ?? 0)
        let max_id : Int = isPullup ? Int(statusList.last?.status.id ?? 0) : 0
        
        StatusDAL.loadStatus(since_id: since_id, max_id: max_id) { (array) in
            
            guard let array = array else{
                finished(false)
                return
            }
         
            //可变数组
            var datalist = [StatusViewModel]()
            
            //遍历数组
            for dict in array{
                let model = Status(dict: dict)
                
                datalist.append(StatusViewModel(status:model))
            }
            
            self.pulldownCount = (since_id > 0) ? datalist.count : nil
            
            if max_id > 0 {
                self.statusList += datalist
            } else{
                 self.statusList = datalist + self.statusList
            }
            
            self.cacheSingleImage(dataList: self.statusList,finished: finished)
        }
    }
    //缓存单张图片
    private func cacheSingleImage(dataList:[StatusViewModel],finished: @escaping (_ isSuccessed: Bool)->()){
        
        let group  = DispatchGroup.init()
        
        var dataLength = 0
        
        for vm in dataList{
            if vm.thumbnailUrls?.count != 1{
                continue
            }
            
            let url = vm.thumbnailUrls![0]
            
            group.enter()
            
            // SDWebImage 的核心下载函数，如果本地缓存已经存在，同样会通过完成回调返回
            // 如果设置了 SDWebImageOptions.RetryFailed，如果下载失败，block 会结束一次，会做一次出组
            // SDWebImage 会重新执行下载，下载完成之后，`再次`调用 block 中的代码
            // 再次调用出组函数，造成调度组的不匹配！
            // SDWebImageOptions.RefreshCached，第一次发起网络请求，把缓存图片的一个 hash 值发送给服务器
            // 服务器比对 hash 值，如果和服务器内容一致，服务器返回的状态码 304，表示服务器内容没有变化！
            // 如果不是 304 会再次发起网络请求，获得更新后的内容！
            //SDWebImage - 下载图像
            SDWebImageManager.shared().loadImage(
                with: url,
                options: [],
                progress: nil,
                completed: { (image,_,_,_,_,_) in
                    if let img = image ,
                        let data = UIImagePNGRepresentation(img) {
                        dataLength += data.count
                    }
                    
                    group.leave()
            })
        }
        
        group.notify(queue: DispatchQueue.main) {
            print("缓存完成 \(dataLength/1024) K")
             finished(true)
        }
    }
}
